package com.hdp.kotlin_samples.high

/**
 * author:hdp
 * on:2019/6/13:14:26
 * desc:
 *
 * 高阶函数简化代码
 * 高阶函数：以另一个函数作为参数或者返回值的函数
 * 函数类型
 * (Int, String) -> Unit
 * 参数类型->返回类型 Unit不能省略
 *
 */
class tips9_highfun {
}

fun main() {
    println("12eafsfsfdbzzsa".filter { it in 'a'..'f' })
    println("12eafsfsfdbzzsa".filter { it in 'a'..'z' })
}

/*
* 函数作为参数，实现String类的字符过滤
* */
fun String.filter(predicate: (Char) -> Boolean): String {
    val sb = StringBuilder()
    for (index in 0 until length) {
        val element = get(index)
        if (predicate(element)) sb.append(element)
    }
    return sb.toString()
}

/**
 * 函数作为返回值
 * 函数作为返回值也非常实用，例如我们的需求是根据不同的快递类型返回不同计价公式，
 * 普通快递和高级快递的计价规则不一样，这时候我们可以将计价规则函数作为返回值：
 */
enum class Delivery {
    STANDARD, EXPEDITED
}

/*
* 根据不同的运输类型返回不同的快递方式
* */
fun getShippingCostCalculator(delivery: Delivery): (Int) -> Double {
    if (delivery == Delivery.EXPEDITED) {
        return { 6 + 2.1 * it }
    }
    return { 1.3 * it }
}

fun test_fun_as_return() {
    val calculator1 = getShippingCostCalculator(Delivery.EXPEDITED)
    val calculator2 = getShippingCostCalculator(Delivery.STANDARD)
    println("Ex costs ${calculator1(5)}")
    println("St costs ${calculator2(5)}")
}
